#ifndef LC3_H
#define LC3_H

/**
 * 自定义数据类型
 * LC-3 指令均为 16 位 
 */
typedef unsigned short uint16_t ;

/**
 * LC-3 指令组成
 * 操作码          op : 4bit
 * 目的操作数寄存器 rd : 3bit
 * 第一操作数寄存器 rs : 3bit
 * 操作数寻址模式   md : 1bit
 * 暂时保留未使用   __ : 2bit
 * 第二操作数寄存器 rt : 3bit
 */ 
class LC3 
{
private:
    /**
     * 指令的组成
     */ 
    uint16_t op : 4;  // 操作码，4bit
    uint16_t rd : 3;  // 目的操作数寄存器，3bit
    uint16_t rs : 3;  // 第一操作数寄存器，3bit
    uint16_t md : 1;  // 寻址模式，1bit，为 1 时表示立即数寻址
    uint16_t __ : 2;  // 保留
    uint16_t rt : 3;  // 第二操作数寄存器，3bit
public:
    LC3();
    LC3(uint16_t);

    uint16_t  bit(uint16_t);                                         // 取出指令中的某一比特位
    uint16_t  group();                                               // 指令成分组合
    void      part(uint16_t &, uint16_t &, uint16_t &, uint16_t &);  // 指令成分分离

    void      operator=(uint16_t);        // 重载赋值运算符
    void      operator=(const LC3 &);     // 重载赋值运算符
    uint16_t  operator&(uint16_t);        // 重载按位与运算符
    uint16_t  operator<<(uint16_t);       // 重载左移运算符
    uint16_t  operator>>(uint16_t);       // 重载右移运算符
};

#endif